<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>state</title>
</head>

<body>
    <!--准备好一个容器-->
    <div id="test"></div>
    <!--引入核心库-->
    <script src="../js/react.development.js"></script>
    <!--引入react-dom支持react操纵dom-->
    <script src="../js/react-dom.development.js"></script>
    <!--引入babel用于将jsx转为js-->
    <script src="../js/babel.min.js"></script>

    <script type="text/babel">
        //1.创建组件
        class Weather extends React.Component {
            //构造器调用了一次
            constructor(props) {
                super(props)
                //初始化状态
                this.state = { isHot: true }//把天气是否炎热的数据维护到了状态
                //解决this指向问题
                this.changeWeather = this.changeWeather.bind(this)
            }
            /*
            解释构造器最后一行代码 等号前半部分说明的是在构造器中说明了新加函数的名称
            等号后依次为this指向组件内的自定义函数再由bind重新指向
            */

            //render调用了1+n次 1是初始化渲染的那次 状态更新的次数为n

            render() {//为什么render里的this也指向Weather 因为写了<Weather/>组件标签 react自动将Weather实例化了
                const { isHot } = this.state//通过this指向实例化对象读取isHot属性
                return <h1 onClick={this.changeWeather}>今天天气{isHot ? "很热" : "很冷"}</h1>
            }//严格驼峰命名 函数带括号会直接执行 点击函数内必须加this否则会提示未定义

            //changeWeather调用次数 点几次调用几次
            changeWeather() {
                //changeWeather放在了Weather的原型对象上
                //alert(this.state.isHot); 重点 如果这样写this会丢失


                //获取原来的isHot的值
                const isHot = this.state.isHot;
                //严重注意:状态必须通过setState进行更新 且更新是一种合并 不是替换
                this.setState({ isHot: !isHot });
                //状态不可以直接更改!!!
                //这是一个错误写法:this.state.isHot=!isHot


            }
        }
        //2.渲染到页面
        ReactDOM.render(<Weather />, document.getElementById('test'));


    </script>
</body>

</html>